
29.10.2016, 13:36
|
Интересующийся
|
|
Регистрация: 02.08.2015
Сообщений: 27
|
|
Из-за асинхронного ajax не перезагружается страница
Собственно, у меня есть AJAX запрос, который отправляет на скрипт, в котором, в свою очередь, есть бесконечный цикл. В этом бесконечно цикле проверяется, есть ли новые данные, и если есть, то скрипт отвечает. А если скрипт работает более 100 секунд, то он сам отключает соединение.
Так вот, как сделать так, чтобы если человек перезагружает страницу, либо же выходит из неё, ему не приходилось ждать, пока сервер ответит, либо отключит соединение?
AJAX запрос
function waitForMsg(){
ajax = $.ajax({
type: 'GET',
data: data,
dataType: 'json',
url: 'my_domain',
success: function(data){
waitForMsg();
},
error: function(a, b, c){ setTimeout(waitForMsg(), 1000); }
});
};
$(document).ready(function(){waitForMsg();});
window.onunload=function()
{
ajax.abort();
}
|
|

29.10.2016, 15:59
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Greatest_Duke
|
В этом бесконечно цикле проверяется, есть ли новые данные
|
А для этого нужен цикл да еще бесконечный?
А уход со страницы и не будет ничего ожидать.
|
|

29.10.2016, 16:37
|
Интересующийся
|
|
Регистрация: 02.08.2015
Сообщений: 27
|
|
Цикл бесконечный нужен для того, чтобы не отсылать каждую секунду AJAX запрос.
А, насчет ухода со страницы я не соглашусь. Когда AJAX запрос отправлен, я не могу переходить по ссылкам, обновлять страницу, и закрывать страницу т.к. страница ждет ответа от PHP скрипта.
|
|

29.10.2016, 16:41
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Наверно стоит сбросить таймер запросов при уходе со страницы (window.onunload) clearTimeout(ID), ибо если вкладка не закрыта(или не перекрыта новой страницей), а по переходу со странице с таймером открыта новая, запросы так и будут шуровать... ток реже
Т.е вынести ID из функции
var timId;
function waitForMsg(){
ajax = $.ajax({
type: 'GET',
data: data,
dataType: 'json',
url: 'my_domain',
success: function(data){
waitForMsg();
},
error: function(a, b, c){ timId=setTimeout(waitForMsg(), 1000); }
});
};
$(document).ready(function(){waitForMsg();});
window.onunload=function()
{
clearTimeout(timId);
}
Последний раз редактировалось Deff, 29.10.2016 в 17:17.
|
|

29.10.2016, 16:41
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Greatest_Duke
|
т.к. страница ждет ответа от PHP скрипта.
|
Это если синхронный запрос, но зачем?
|
|

29.10.2016, 16:46
|
Интересующийся
|
|
Регистрация: 02.08.2015
Сообщений: 27
|
|
В том то и дело, что это асинхронный запрос.
|
|

29.10.2016, 16:48
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Если запрос асинхронный, то ни что не мешает клиенту покинуть страницу в любое время. Или что означает Когда AJAX запрос отправлен, я не могу переходить по ссылкам, обновлять страницу, и закрывать страницу - не желание такового с вашей стороны как разработчика?
|
|

29.10.2016, 16:49
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Greatest_Duke
|
Цикл бесконечный нужен для того, чтобы не отсылать каждую секунду AJAX запрос.
А, насчет ухода со страницы я не соглашусь. Когда AJAX запрос отправлен, я не могу переходить по ссылкам, обновлять страницу, и закрывать страницу т.к. страница ждет ответа от PHP скрипта.
|
Я думаю проблемы со ссылками именно из-за нарастания колва Аякс запросов с незакрытых вкладок, ибо брауз их выстраивает со всех вкладок в какую-то очередь
Типично один - два необработанных ассинхронных запроса не мешают серфингу брауза, ибо полно сайтов с лентами новостей по аяксу, так же меняемых по таймированному автозапросу
|
|

29.10.2016, 17:00
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Greatest_Duke
|
отправляет на скрипт, в котором, в свою очередь, есть бесконечный цикл
|
Думаю с первым (с клиентом) понятно, что не так все, а вот как все-таки понимать это? Если клиент разрывает соединение, то серверный скрипт будет продолжать работу. И если это бесконечный цикл, то остановить его можно только по timeout, что уже очень плохо, так можно и завалить сервер запросами клиента по собственному желанию.
И зачем на стороне сервера такой цикл и вообще цикл для данной задачи?
|
|
|
|